package com.yusys.ba03;

import com.yusys.ba02.Student;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;

/**
 * 后置通知定义方法，方法是实现切面功能的
 * 方法的定义要求：
 * 1.公共方法public
 * 2.方法没有返回值
 * 3.方法名称自定义
 * 4.方法有参数
 */
@Aspect
public class MyAspect {


    /**
     * 属性：1.value 切入点表达式
     * 2.returning 自定义变量，表示目标方法的返回值的
     * 自定义变量名必须和通知方法的参数名一样
     * 位置：在方法定义的上面
     * 特点：
     * 1.在目标方法之后执行的
     * 2.能够获取到目标方法的返回值，可以根据这个返回值做不同的处理功能
     * Object res = doOther();
     * 3.可以修改这个返回值
     *
     * @param res
     */
    @AfterReturning(value = "execution(* *..SomeServiceImpl.doOther(..))", returning = "res")
    public void myAfterReturning(Object res) {
        System.out.println("后置通知：在目标方法之后执行的，获取的返回值是：" + res);
    }

    @AfterReturning(value = "execution(* *..SomeServiceImpl.doOther2(..))", returning = "res")
    public void myAfterReturning2(Object res) {
        System.out.println("后置通知：在目标方法之后执行的，获取的返回值是：" + res);
//        if (res != null) {
//            // 直接获取原油对象，是可以修改参数的
//            Student student = (Student) res;
//            student.setName("王五");
//            student.setAge(25);
//        }
        if (res != null) {
            // 开辟新的堆内存中的对象，不会修改原有参数
            Student student = new Student();
            student.setName("王五");
            student.setAge(25);
            res = student;
        }
    }
}
